package com.own.business.push.core.util;

import com.own.business.push.core.base.BaseSaveRegistrationIdMethod;
import com.own.business.push.core.config.PushCoreConfig;
import com.own.business.push.core.model.MessagePushContentModel;
import com.own.business.push.core.model.RegisterRegistrationIdModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * UnitePushClientUtil
 *
 * @author chenxueli
 * @date 2023-11-15 10:56:00
 */
@Slf4j
@Component
public class UnitePushClientUtil {

    @Resource
    private BaseSaveRegistrationIdMethod baseSaveRegistrationIdMethod;
    @Resource
    private PushCoreConfig pushCoreConfig;

    /**
     * 推送给单个模块的用户
     *
     * @param module       模块名称
     * @param contentModel 内容
     */
    public void pushByModule(String module, MessagePushContentModel contentModel) {
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        var regIdList = baseSaveRegistrationIdMethod.listRegIdListByModule(module);
        util.regId(regIdList, contentModel);
    }

    /**
     * 推送给所有的用户
     *
     * @param contentModel 内容
     */
    public void pushAll(MessagePushContentModel contentModel) {
        // 获取所有的工具类型
        var names = pushCoreConfig.names();
        // 根据模块名称查询所有的注册id列表
        names.forEach(name -> {
            var util = pushCoreConfig.get(name);
            if (util == null) {
                log.info("没有找到对应的推送客户端:{}", name);
                return;
            }
            var regIdList = baseSaveRegistrationIdMethod.listRegIdListByModule(name);
            util.regId(regIdList, contentModel);
        });
    }

    /**
     * 用户id推送
     *
     * @param userId       用户id
     * @param contentModel 内容
     */
    public void pushByUserId(Long userId, MessagePushContentModel contentModel) {
        // 获取对应用户id的保存信息
        var item = baseSaveRegistrationIdMethod.getByUserId(userId);
        // 获取注册id
        var module = item.getModule();
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        util.regId(item.getRegistrationId(), contentModel);
    }

    /**
     * 用户id推送
     *
     * @param userIdList   注册id列表
     * @param contentModel 内容
     */
    public void pushByUserId(List<Long> userIdList, MessagePushContentModel contentModel) {
        // 获取对应用户id的保存信息
        var itemList = baseSaveRegistrationIdMethod.listByUserIdList(userIdList);
        // 分组
        itemList.stream()
                .collect(Collectors.groupingBy(RegisterRegistrationIdModel::getModule, Collectors.mapping(RegisterRegistrationIdModel::getRegistrationId, Collectors.toList())))
                .forEach((module, values) -> {
                    var util = pushCoreConfig.get(module);
                    if (util == null) {
                        log.info("没有找到对应的推送客户端:{}", module);
                        return;
                    }
                    util.regId(values, contentModel);
                });
    }

    /**
     * 注册id推送
     *
     * @param module       模块
     * @param regId        注册id
     * @param contentModel 内容
     */
    public void pushByRegId(String module, String regId, MessagePushContentModel contentModel) {
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        util.regId(regId, contentModel);
    }

    /**
     * 注册id推送
     *
     * @param module       模块
     * @param regIdList    别名列表
     * @param contentModel 内容
     */
    public void pushByRegIe(String module, List<String> regIdList, MessagePushContentModel contentModel) {
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        util.regId(regIdList, contentModel);
    }

    /**
     * 别名推送
     *
     * @param module       模块
     * @param alias        别名
     * @param contentModel 内容
     */
    public void pushByAlias(String module, String alias, MessagePushContentModel contentModel) {
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        util.alias(alias, contentModel);
    }

    /**
     * 别名推送
     *
     * @param module       模块
     * @param aliasList    别名列表
     * @param contentModel 内容
     */
    public void pushByAlias(String module, List<String> aliasList, MessagePushContentModel contentModel) {
        var util = pushCoreConfig.get(module);
        if (util == null) {
            log.info("没有找到对应的推送客户端:{}", module);
            return;
        }
        util.alias(aliasList, contentModel);
    }

}
